home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 21 / CU Amiga Magazine's Super CD-ROM 21 (1998)(EMAP Images)(GB)[!][issue 1998-04].iso / CUCD / Programming / dclistview / myreq2.e < prev    next >
Text File  |  1998-01-17  |  9KB  |  343 lines

  1. /* Original version by Jason                    **
  2. ** Some sections modified by Victor Ducedre,    **
  3. ** as indicated, for DCListview demo            */
  4.  
  5. OPT OSVERSION=37, PREPROCESS
  6.  
  7. -> Comment out this #define if you don't have/want to use sortlist.m
  8. #define SORTLIST
  9.  
  10. MODULE 'tools/EasyGUI', 'tools/exceptions', 'amigalib/lists', 'utility',
  11.        'gadtools', 'libraries/gadtools', 'exec/lists', 'exec/nodes',
  12.        'dos/dos', 'dos/exall', 'dos/dosextens', 'plugins/dclistview', 'utility/tagitem'
  13.  
  14. #ifdef SORTLIST
  15. MODULE '*sortlist'
  16. #endif
  17.  
  18. ENUM ERR_NONE, ERR_NEW, ERR_STR, ERR_LOCK, ERR_ADO, ERR_NODE, ERR_LIB, ERR_PATT,
  19.      ERR_OK, ERR_CANCEL
  20.  
  21. RAISE ERR_NEW  IF New()=NIL,
  22.       ERR_STR  IF String()=NIL,
  23.       ERR_LOCK IF Lock()=NIL,
  24.       ERR_ADO  IF AllocDosObject()=NIL,
  25.       ERR_LIB  IF OpenLibrary()=NIL,
  26.       ERR_PATT IF ParsePatternNoCase()=-1
  27.  
  28. #define DIRSTR '<DIR> '
  29. #define VOLSTR '<VOL> '
  30. #define ASNSTR '<ASN> '
  31. CONST DIRSTRLEN=6
  32.  
  33. CONST BUF_SIZE=1024, FILENAME_SIZE=300
  34. CONST PATTERNBUFF_SIZE=FILENAME_SIZE*2+2
  35. ENUM DIR_NODE, POS_NODE, VOL_NODE, ASN_NODE, FILE_NODE, MAX_TYPE
  36.  
  37. DEF pathStr[FILENAME_SIZE]:STRING, currPath[FILENAME_SIZE]:STRING,
  38.     fileStr[FILENAME_SIZE]:STRING, patternStr[FILENAME_SIZE]:STRING,
  39.     patternBuff[PATTERNBUFF_SIZE]:ARRAY,
  40.     pathGad, fileGad, patternGad,
  41.     nameList=NIL:PTR TO lh, posList=NIL:PTR TO lh
  42.  
  43. DEF gh=NIL:PTR TO guihandle,
  44.     dclist=NIL:PTR TO dclistview
  45.  
  46. -> Store the contents of path directory in list
  47. PROC getDir() HANDLE
  48.   DEF success, eacontrol=NIL:PTR TO exallcontrol, lock=NIL,
  49.       dlock=NIL, dl:PTR TO doslist, buffer[BUF_SIZE]:ARRAY, items=0
  50. #ifndef SORTLIST
  51.   freeNodes(nameList)
  52. #endif
  53. #ifdef SORTLIST
  54.   emptySortedList(nameList)
  55. #endif
  56.   IF currPath[]  -> Valid path
  57.     lock:=Lock(currPath, ACCESS_READ)
  58.     eacontrol:=AllocDosObject(DOS_EXALLCONTROL, NIL)
  59.     eacontrol.lastkey:=0
  60.     eacontrol.matchstring:=patternBuff
  61.     REPEAT
  62.       success:=ExAll(lock, buffer, BUF_SIZE, ED_TYPE, eacontrol)
  63.       IF eacontrol.entries<>0 THEN items:=items+addItems(buffer)
  64.     UNTIL success=FALSE
  65.   ELSE  -> Do a volume and assign list
  66.     dl:=(dlock:=LockDosList(LDF_VOLUMES OR LDF_ASSIGNS OR LDF_READ))
  67.     WHILE dl:=NextDosEntry(dl, LDF_VOLUMES OR LDF_ASSIGNS)
  68.       addEntry(BADDR(dl.name),IF dl.type=DLT_VOLUME THEN VOL_NODE ELSE ASN_NODE)
  69.       INC items
  70.     ENDWHILE
  71.   ENDIF
  72. #ifdef SORTLIST
  73.   IF items THEN makeSortedList(nameList, items, SIZEOF ln)  -> Sort it
  74. #endif
  75. EXCEPT DO
  76.   IF eacontrol THEN FreeDosObject(DOS_EXALLCONTROL, eacontrol)
  77.   IF lock THEN UnLock(lock)
  78.   IF dlock THEN UnLockDosList(LDF_VOLUMES OR LDF_ASSIGNS OR LDF_READ)
  79.   IF exception=ERR_LOCK
  80.     DisplayBeep(NIL)
  81.   ELSE
  82.     ReThrow()
  83.   ENDIF
  84. ENDPROC
  85.  
  86. -> Add a Dos List entry
  87. PROC addEntry(bname, type)
  88.   addNode(nameList, bname+1, type, 0, bname[])
  89. ENDPROC
  90.  
  91. -> Add the items from one call to ExAll
  92. PROC addItems(buffer)
  93.   DEF eabuf:PTR TO exalldata, items=0
  94.   eabuf:=buffer
  95.   WHILE eabuf
  96.     addNode(nameList, eabuf.name,
  97.             IF eabuf.type>0 THEN DIR_NODE ELSE FILE_NODE, 0)
  98.     INC items
  99.     eabuf:=eabuf.next
  100.   ENDWHILE
  101. ENDPROC items
  102.  
  103. -> Free a normal list of nodes and empty it
  104. PROC freeNodes(list:PTR TO lh)
  105.   DEF worknode:PTR TO ln, nextnode
  106.   worknode:=list.head  -> First node
  107.   WHILE nextnode:=worknode.succ
  108.     IF worknode.name THEN DisposeLink(worknode.name)
  109.     END worknode
  110.     worknode:=nextnode
  111.   ENDWHILE
  112.   newList(list)
  113. ENDPROC
  114.  
  115. -> Add a new node to the list
  116. PROC addNode(list, name, type, pri, len=0) HANDLE
  117.   DEF node=NIL:PTR TO ln, s=NIL
  118.   NEW node
  119.   IF name
  120.     SELECT MAX_TYPE OF type
  121.     CASE FILE_NODE
  122.       s:=StrCopy(String(StrLen(name)), name)
  123.     CASE DIR_NODE
  124.       s:=String(StrLen(name)+DIRSTRLEN)
  125.       StrCopy(s, DIRSTR)
  126.       StrAdd(s, name)
  127.     CASE VOL_NODE
  128.       s:=String(len+DIRSTRLEN+1)
  129.       StrCopy(s, VOLSTR)
  130.       StrAdd(s, name, len)
  131.       StrAdd(s, ':')
  132.     CASE ASN_NODE
  133.       s:=String(len+DIRSTRLEN+1)
  134.       StrCopy(s, ASNSTR)
  135.       StrAdd(s, name, len)
  136.       StrAdd(s, ':')
  137.     ENDSELECT
  138.   ENDIF
  139.   node.name:=s
  140.   node.type:=type
  141.   node.pri:=pri
  142.   AddTail(list, node)
  143. EXCEPT
  144.   IF node THEN END node
  145.   IF s THEN DisposeLink(s)
  146.   Throw(ERR_NODE, type)
  147. ENDPROC
  148.  
  149. -> Change the list to be a listing of volumes and assigns
  150. PROC volsList()
  151.   freeNodes(posList)
  152.   SetStr(currPath, 0)
  153.   changeList()
  154. ENDPROC
  155.  
  156. -> Add dir to path and change list
  157. PROC addDir(dir) HANDLE
  158.   addNode(posList, NIL, POS_NODE, EstrLen(currPath))
  159.   IF currPath[] AND (currPath[EstrLen(currPath)-1]<>":")
  160.     StrAdd(currPath, '/')
  161.   ENDIF
  162.   StrAdd(currPath, dir)
  163.   changeList()
  164. EXCEPT
  165.   -> Fix plist if exception not from first line (addNode to plist)
  166.   IF (exception<>ERR_NODE) OR (exceptioninfo<>POS_NODE) THEN parentPos()
  167.   ReThrow()
  168. ENDPROC
  169.  
  170. -> Set path to be its parent
  171. PROC parentPos()
  172.   DEF node:PTR TO ln
  173.   IF node:=RemTail(posList)
  174.     SetStr(currPath, node.pri)
  175.     END node
  176.     RETURN TRUE
  177.   ELSE
  178.     RETURN FALSE
  179.   ENDIF
  180. ENDPROC
  181.  
  182. -> Change the displayed list             ->*** modified for DCListview demo
  183. PROC changeList() HANDLE
  184.   -> Remove list
  185.   dclist.set(DCLV_CURRENT,-1)
  186.   dclist.set(DCLV_LIST,-1)
  187.   -> Change list contents
  188.   getDir()
  189. EXCEPT DO
  190.   setstr(gh, pathGad, currPath)
  191.   -> Reattach list
  192.   dclist.set(DCLV_LIST,nameList)
  193.   dclist.set(DCLV_TOP,0)
  194.   ReThrow()
  195. ENDPROC
  196.  
  197. -> Split path into directory positions
  198. PROC splitDir() HANDLE
  199.   DEF i
  200.   freeNodes(posList)
  201.   addNode(posList, NIL, POS_NODE, 0)
  202.   IF -1<>(i:=InStr(currPath, ':'))
  203.     IF currPath[i+1]
  204.       addNode(posList, NIL, POS_NODE, i+1)
  205.       WHILE -1<>(i:=InStr(currPath, '/', i+1))
  206.         addNode(posList, NIL, POS_NODE, i)
  207.       ENDWHILE
  208.     ENDIF
  209.   ENDIF
  210. EXCEPT
  211.   SetStr(currPath, 0)
  212. ENDPROC
  213.  
  214. -> Parse the directory from a lock, set up plist
  215. PROC setDir(lock)
  216.   IF NameFromLock(lock, pathStr, FILENAME_SIZE)
  217.     SetStr(pathStr, StrLen(pathStr))
  218.     StrCopy(currPath, pathStr)
  219.     splitDir()
  220.   ENDIF
  221. ENDPROC
  222.  
  223. -> Check this string is a real directory and set it
  224. PROC checkDir(dir) HANDLE
  225.   DEF lock=NIL, fib=NIL:PTR TO fileinfoblock
  226.   lock:=Lock(dir, ACCESS_READ)
  227.   fib:=AllocDosObject(DOS_FIB, NIL)
  228.   IF Examine(lock, fib)
  229.     IF fib.direntrytype>0
  230.       setDir(lock)
  231.       changeList()
  232.       Raise(ERR_NONE)  -> Finished, clean up
  233.     ENDIF
  234.   ENDIF
  235.   DisplayBeep(NIL)  -> Something minor went wrong...
  236. EXCEPT DO
  237.   IF fib THEN FreeDosObject(DOS_FIB, fib)
  238.   IF lock THEN UnLock(lock)
  239.   IF exception=ERR_LOCK
  240.     DisplayBeep(NIL)
  241.   ELSE
  242.     ReThrow()
  243.   ENDIF
  244. ENDPROC
  245.  
  246. PROC setPattern(s)
  247.   ParsePatternNoCase(s, patternBuff, PATTERNBUFF_SIZE)
  248.   changeList()
  249. ENDPROC
  250.  
  251.  
  252. -> GUI actions:
  253.  
  254. PROC a_pattern(info, str) IS setPattern(IF str[] THEN str ELSE '#?')
  255.  
  256. PROC a_path(info, str) IS checkDir(str)
  257.  
  258. PROC a_file(info, str) IS Raise(ERR_OK)
  259.  
  260. PROC a_list(info, list:PTR TO dclistview)->*** modified for DCListview demo
  261.   DEF node:PTR TO ln, sel, i=0
  262.   sel:=list.get(DCLV_CURRENT)
  263.   node:=nameList.head  -> First node
  264.   WHILE node.succ AND (i<sel)
  265.     node:=node.succ
  266.     INC i
  267.   ENDWHILE
  268.   IF node.type<>FILE_NODE
  269.     addDir(node.name+DIRSTRLEN)
  270.   ELSE
  271.     IF node.type=FILE_NODE THEN setstr(gh, fileGad, node.name)
  272.     IF list.get(DCLV_CLICK) THEN Raise(ERR_OK)  -> Double click on file
  273.   ENDIF
  274. ENDPROC
  275.  
  276. PROC b_ok(info) IS Raise(ERR_OK)
  277.  
  278. PROC b_cancel(info) IS Raise(ERR_CANCEL)
  279.  
  280. PROC b_vols(info) IS volsList()
  281.  
  282. PROC b_parent(info)
  283.   IF parentPos()
  284.     changeList()
  285.   ELSE
  286.     DisplayBeep(NIL)
  287.   ENDIF
  288. ENDPROC
  289.  
  290. -> GUI definition                        ->*** modified for DCListview demo
  291. PROC fileRequester()
  292.   easyguiA('Select a file:',
  293.     [EQROWS,
  294.       [DCLIST, {a_list},dclist, TRUE],  ->      NIL,13,10,nameList,0,NIL,0],
  295.       patternGad:=[STR,{a_pattern},'Pattern',patternStr,FILENAME_SIZE,5],
  296.       pathGad:=[STR,{a_path},'Drawer',pathStr,FILENAME_SIZE,5],
  297.       fileGad:=[STR,{a_file},'File',fileStr,200,5],
  298.       [EQCOLS,
  299.         [SBUTTON,{b_ok},'Ok'],
  300.         [SBUTTON,{b_vols},'Disks'],
  301.         [SBUTTON,{b_parent},'Parent'],
  302.         [SBUTTON,{b_cancel},'Cancel']
  303.       ]
  304.     ],[EG_GHVAR, {gh}, TAG_DONE]
  305.   )
  306. ENDPROC
  307.  
  308. PROC main() HANDLE                       ->*** modified for DCListview demo
  309.   DEF here=NIL
  310.   utilitybase:=OpenLibrary('utility.library', 37)
  311.   gadtoolsbase:=OpenLibrary('gadtools.library', 37)
  312.   NEW nameList, posList
  313.   NEW dclist.dclistview([DCLV_RELX,13,
  314.                          DCLV_RELY,10,
  315.                          DCLV_LIST,nameList,
  316.                          DCLV_CURRENT,-1,
  317.                          TAG_DONE])
  318.   newList(nameList)
  319.   newList(posList)
  320.   StrCopy(patternStr, '~(#?.info)')
  321.   ParsePatternNoCase(patternStr, patternBuff, PATTERNBUFF_SIZE)
  322.   here:=CurrentDir(NIL)
  323.   setDir(here)
  324.   CurrentDir(here)
  325.   getDir()
  326.   fileRequester()
  327. EXCEPT DO
  328.   END nameList, posList
  329.   IF gadtoolsbase THEN CloseLibrary(gadtoolsbase)
  330.   IF utilitybase THEN CloseLibrary(utilitybase)
  331.   SELECT exception
  332.   CASE ERR_OK
  333.     WriteF('User selected "\s\s\s"\n', currPath,
  334.        IF currPath[] AND (currPath[EstrLen(currPath)-1]<>":") THEN '/' ELSE '',
  335.        fileStr)
  336.   CASE ERR_CANCEL
  337.     WriteF('User cancelled requester\n')
  338.   DEFAULT
  339.     report_exception()
  340.   ENDSELECT
  341. ENDPROC
  342.  
  343.